home *** CD-ROM | disk | FTP | other *** search
/ LSD Docs / LSD Docs.iso / FILEZ / lsdgra07.dms / lsdgra07.adf / GRAPEVINE7 / freemenu.s.pp / freemenu.s
Text File  |  1990-09-07  |  38KB  |  2,066 lines

  1.  
  2.     Section menu,code
  3.     opt    c-,o+,w-
  4.  
  5.     incdir    "df1:"
  6.  
  7.     **************************************************************
  8.     *                                      *
  9.     *  PD LIBRARIES NOTE:                         *
  10.     *                                      *
  11.     *  THIS MENU WAS WRITTEN AND COPYRIGHT TO SHAGRATT OF LSD    *
  12.     *  AND MAY ONLY BE DISTRIBUTED AS LONG AS IT IS ACOMPANIED   *
  13.     *  BY GRAPEVINE ISSUE 7 AND IS NOT MODIFIED INY ANY WAY.     *
  14.     *                                      *
  15.     **************************************************************
  16.     
  17.     **************************************************************
  18.     *                                      *
  19.     *  Logo: Must be 320x50, 16 colours                 *
  20.     *                                      *
  21.     *  Cut out raw (Keferens IFF Converter) with              *
  22.     *  colour map before, blit normal                 *
  23.     *                                      *    
  24.     **************************************************************
  25.  
  26.     **************************************************************
  27.     *                                      *
  28.     *  NOTE: YOU MUST HAVE `RUN' IN THE C DIRECTORY OF THE DISK  *
  29.     *  THIS MENU WILL BE USED ON.                     *
  30.     *                                      *    
  31.     **************************************************************
  32.     
  33.     
  34. linecol        = $008        ; highlight colour
  35. topcur        = $5e07        ; start of selector line
  36. tall        = 10        ; height of text
  37.  
  38. loop        = 0        ; (if 1, menu stay in memory, if 0, menu quit)
  39.  
  40. havebottomlogo    = 0        ; display bottom logo?
  41. bottomlogo    = 6        ; no. of lines to shorten bottom logo!
  42.  
  43. curvecopper    MACRO
  44.         dc.w    $180,$00f
  45.         
  46.         ENDM
  47.  
  48.  
  49. begin1:    move.l    #0,quit
  50.  
  51.     move.l    4.w,a6
  52.     jsr    -132(a6)    ; forbid
  53.  
  54.     move.l    4.w,a6        ; execbase
  55.     move.l    #40*256,d0    ; size to allocate
  56.     move.l    #$10002,d1    ; chipmem
  57.     jsr    -198(a6)    ; allocmem
  58.     beq    reset
  59.     move.l    d0,screen1
  60.  
  61.     clr.l    d0
  62.     move.b    $dff00a,d0
  63.     move.l    d0,oldy
  64.  
  65.     lea    glib,a1        ; graphics library
  66.     moveq    #0,d0
  67.     move.l    4.w,a6        
  68.     jsr    -$228(a6)    ; open old library
  69.     tst    d0
  70.     beq    error
  71.     move.l    d0,graphics
  72.  
  73.     lea    logocmap+2,a0    ; get address of copperlist
  74.     lea    logocmap2+2,a2
  75.     lea    logo,a1        ; get addresss of colours for logo
  76.     move.w    #15,d0
  77. cmap2loop:
  78.     move.w    (a1),(a0)
  79.     move.w    (a1),(a2)
  80.     add.l    #4,a0
  81.     add.l    #4,a2
  82.     add.l    #2,a1
  83.     dbf    d0,cmap2loop    
  84.  
  85.     move.l    #logo+32,d0    ; setup bitplane addresses for picture
  86.     move.w    d0,bplane0_lo
  87.     swap    d0
  88.     move.w    d0,bplane0_hi
  89.     swap    d0
  90.     add.l    #40*50,d0    
  91.     move.w    d0,bplane1_lo
  92.     swap    d0
  93.     move.w    d0,bplane1_hi
  94.     swap    d0
  95.     add.l    #40*50,d0    
  96.     move.w    d0,bplane2_lo
  97.     swap    d0
  98.     move.w    d0,bplane2_hi
  99.     swap    d0
  100.     add.l    #40*50,d0    
  101.     move.w    d0,bplane3_lo
  102.     swap    d0
  103.     move.w    d0,bplane3_hi
  104.  
  105.     IFNE    havebottomlogo
  106.  
  107.     move.l    #logo+32+(49*40)-(bottomlogo*40),d0
  108.     move.w    d0,blane0_lo
  109.     swap    d0
  110.     move.w    d0,blane0_hi
  111.     swap    d0
  112.     add.l    #40*50,d0    
  113.     move.w    d0,blane1_lo
  114.     swap    d0
  115.     move.w    d0,blane1_hi
  116.     swap    d0
  117.     add.l    #40*50,d0    
  118.     move.w    d0,blane2_lo
  119.     swap    d0
  120.     move.w    d0,blane2_hi
  121.     swap    d0
  122.     add.l    #40*50,d0    
  123.     move.w    d0,blane3_lo
  124.     swap    d0
  125.     move.w    d0,blane3_hi
  126.  
  127.     ENDC
  128.  
  129.     move.l    Screen1,d0
  130.     move.w    d0,bitplane0_lo
  131.     swap    d0
  132.     move.w    d0,bitplane0_hi
  133.  
  134.     move.l    #page1,page
  135.     bsr    setup_screen        ; display text screen
  136.  
  137.     move.l    #-1,step
  138.     
  139.     move.l    graphics,a6
  140.     add.l    #$32,a6
  141.     move.w    #$80,$dff096        ; dma control write
  142.     move.l    (a6),old_copper        ; store the address of the
  143.     lea    my_copper,a0
  144.     move.l    a0,(a6)            ; old copperlist
  145.     move.w    #$8080,$dff096        ; dma control write
  146.     move.w    #$8010,$dff09a        ; interupt enable bits
  147.     move.l    $6c.w,old_interupt    ; store old level 3 int
  148.     lea    new_interupt,a0
  149.     move.l    a0,$6c.w        ; store my routine
  150.  
  151.     bsr    mt_init            ; start music
  152.     bsr    waitmouse
  153.     bsr    mt_end            ; stop music
  154.     
  155.     move.l    old_interupt,$6c.w    ; resore old level 3 int
  156.     move.l    #$10,$dff09a         ; Disable Level 3 Interupt
  157.     move.l    graphics,a6
  158.     add.l    #$32,a6
  159.     move.w    #$0080,$dff096
  160.     move.l    old_copper,(a6)        ; restore old copper list
  161.     move.w    #$8080,$dff096
  162.     
  163.     move.l    4.w,a6
  164.     move.l    screen1,a1        ; address of memory
  165.     move.l    #40*256,d0        ; size of memory
  166.     jsr    -210(a6)        ; deallocate memory
  167.  
  168.     move.l    4.w,a6
  169.     jsr    -138(a6)        ; permit
  170.  
  171.     bsr    loadfile        
  172.  
  173.     move.l    filename,a0
  174.     cmp.l    #"run ",(a0)        ; if filename starts with run
  175.     beq    error            ; exit the menu anyway!
  176.     cmp.l    #"RUN ",(a0)
  177.     beq    error
  178.  
  179.     IFNE    loop
  180.     bra    begin1
  181.     ENDC
  182.  
  183. Error:    move.w    #0,$bfec00        ; empty buffer
  184.     moveq    #0,d0            ; fin
  185.     rts
  186.  
  187.  
  188. loadfile:
  189.     move.l    #256,d0
  190.     sub.l    ypos,d0
  191.     
  192.     divu    #tall,d0
  193.     and.l    #$ffff,d0
  194.     
  195.     mulu    #4,d0
  196.     lea    flist,a0
  197.     add.l    d0,a0
  198.     
  199.     move.l    (a0),filename
  200.  
  201.     lea    doslib,a1
  202.     moveq    #0,d0
  203.     move.l    4.w,a6
  204.     jsr    -$228(a6)
  205.     tst    d0
  206.     beq    err
  207.     move.l    d0,dosbase
  208.     
  209.     move.l    d0,a6
  210.     clr.l    d0
  211.     move.l    filename,d1
  212.     move.l    #0,d2
  213.     move.l    #0,d3    
  214.     jsr    -222(a6)
  215.  
  216.     move.l    graphics,a6
  217.     add.l    #$32,a6
  218.     move.l    old_copper,(a6)        ; restore old copper list
  219.  
  220.     Clr.l    d0
  221.     Rts
  222.  
  223. err:    move.w    #$fffe,d0
  224. errloop:
  225.     Move.w    $dff006,$dff180
  226.     dbf    d0,errloop
  227.  
  228.     move.l    graphics,a6
  229.     add.l    #$32,a6
  230.     move.l    old_copper,(a6)        ; restore old copper list
  231.  
  232.     clr.l    d0
  233.     rts
  234.  
  235.  
  236. waitmouse:
  237.     cmp.l    #0,quit
  238.     beq    waitmouse
  239.  
  240.     move.l    #256,d0
  241.     sub.l    ypos,d0
  242.     
  243.     divu    #tall,d0
  244.     and.l    #$ffff,d0
  245.     
  246.     mulu    #4,d0
  247.     lea    flist,a0
  248.     add.l    d0,a0
  249.     
  250.     move.l    (a0),a0
  251.     cmp.b    #0,(a0)
  252.     bne    error            ; do a rts
  253.     
  254.     move.l    #0,quit
  255.     bra    waitmouse
  256.  
  257.  
  258. reset:    move.l    4.w,a6
  259.     clr.l    $026(a6)        ; hard reset
  260.     lea    $fc00d0,a5
  261.     jmp    -$1e(a6)
  262.  
  263.  
  264.  
  265. readjoy:
  266.     move.w    $dff00c,d0
  267.     and.w    #$100,d0
  268.     bne    joyup
  269.     move.w    $dff00c,d0
  270.     and.w    #$001,d0
  271.     bne    joydown
  272.     
  273.     btst    #7,$bfe001
  274.     beq    keyquit
  275.     
  276.     rts
  277.     
  278. joyup:    add.l    #1,ypos
  279.     move.l    #+1,step    
  280.     rts    
  281.  
  282. joydown:sub.l    #1,ypos
  283.     move.l    #-1,step    
  284.     rts    
  285.      
  286. readkeyboard:
  287.     move.b    $bfec01,d0
  288.     cmp.b    #103,d0
  289.     beq    keyup
  290.     cmp.b    #101,d0
  291.     beq    keydown
  292.     cmp.b    #119,d0
  293.     beq    keyquit
  294.     rts
  295.     
  296. keyup:    add.l    #10,ypos
  297.     move.l    #+10,step    
  298.     rts
  299.     
  300. keydown:sub.l    #10,ypos
  301.     move.l    #-10,step    
  302.     rts
  303.     
  304. keyquit:move.l    #-1,quit
  305.     rts
  306.          
  307. readmouse:
  308.     btst    #6,$bfe001
  309.     bne.s    nomouse
  310.     
  311.     move.l    #-1,quit
  312.     rts
  313.     
  314. nomouse:
  315.     bsr    readkeyboard
  316.     bsr    readjoy
  317.  
  318.     clr.b    $bfec01            ; clear keyboard buffer
  319.  
  320.     clr.l    d0
  321.     clr.l    d1
  322.     
  323.     move.b    $dff00a,d0
  324.     move.l    oldy,d1
  325.     sub.l    d0,d1
  326.     move.l    d1,yp
  327.     
  328.     move.l    d0,oldy
  329.     
  330.     cmp.l    #127,yp
  331.     ble.s    mouse_not_128
  332.     sub.l    #256,yp
  333. mouse_not_128:
  334.     cmp.l    #-127,yp
  335.     bge.s    mouse_not_minus
  336.     add.l    #256,yp
  337. mouse_not_minus:
  338.  
  339.     cmp.l    #0,step
  340.     bne.s    no_change_step
  341.  
  342.     cmp.l    #0,yp
  343.     bpl.s    yp_neg
  344.     
  345.     move.l    #-10,step
  346.     bra    no_change_step
  347.     
  348. yp_neg:    move.l    #+10,step
  349.  
  350. no_change_step:
  351.     move.l    yp,d0
  352.     add.l    d0,ypos
  353. mouse_move_again:
  354.     move.l    ypos,d6
  355.     move.l    lines,d7
  356.     
  357.     cmp.l    d7,d6
  358.     bgt.s    ypos_ok1
  359.     move.l    d7,ypos
  360.     move.l    #0,d5
  361.     move.l    step,d6
  362.     sub.l    d6,d5
  363.     move.l    d5,step
  364.     
  365. ypos_ok1:
  366.     cmp.l    #255,ypos
  367.     blt.s    ypos_ok2
  368.     move.l    #255,ypos
  369.  
  370.     move.l    #0,d5
  371.     move.l    step,d6
  372.     sub.l    d6,d5
  373.     move.l    d5,step
  374.     
  375. ypos_ok2:
  376.     move.l    maxlines,d1
  377.  
  378.     move.l    #256,d0
  379.     sub.l    ypos,d0
  380.     
  381.     divu    #tall,d0
  382.     mulu    #tall,d0
  383.  
  384.     asl.l    #8,d0
  385.     add.l    #topcur,d0
  386.     
  387.     
  388.     move.l    #256,d7
  389.     sub.l    ypos,d7
  390.     
  391.     divu    #tall,d7
  392.     and.l    #$ffff,d7
  393.     
  394.     mulu    #4,d7
  395.     lea    flist,a0
  396.     add.l    d7,a0
  397.     
  398.     move.l    (a0),a0
  399.     cmp.b    #0,(a0)
  400.     bne    mouse_move_valid
  401.  
  402.     move.l    step,d7
  403.     move.l    ypos,d6
  404.     add.l    d7,d6
  405.     move.l    d6,ypos
  406.  
  407.     bra    mouse_move_again
  408.     
  409. mouse_move_valid:
  410.     move.w    d0,cursor1
  411.     add.l    #$0100,d0
  412.     move.w    d0,cursor2
  413.     add.l    #$0100,d0
  414.     move.w    d0,cursor3
  415.     add.l    #$0100,d0
  416.     move.w    d0,cursor4
  417.     add.l    #$0100,d0
  418.     move.w    d0,cursor5
  419.     add.l    #$0100,d0
  420.     move.w    d0,cursor6
  421.     add.l    #$0100,d0
  422.     move.w    d0,cursor7
  423.     add.l    #$0100,d0
  424.     move.w    d0,cursor8
  425.     add.l    #$0100,d0
  426.     move.w    d0,cursor9
  427.     add.l    #$0100,d0
  428.     move.w    d0,cursor10
  429.     add.l    #$0100,d0
  430.     move.w    d0,cursor11
  431.     add.l    #$0100,d0
  432.     move.w    d0,cursor12
  433.     add.l    #$0100,d0
  434.     
  435.     move.l    #0,step
  436.     
  437.     rts    
  438.     
  439. new_interupt:
  440.     movem.l    d0-d7/a0-a6,-(sp)    ; my scroll text
  441.     
  442.     and.w    #$10,$dff01e        ; check for copper interupt
  443.     beq     no_music
  444.     move.w    #$10,$dff09c
  445.  
  446.     cmp.l    #$12345678,mt_data
  447.     beq    no_music
  448.     bsr    mt_music
  449. no_music:
  450.     bsr    readmouse    
  451.     
  452.     movem.l    (sp)+,d0-d7/a0-a6    
  453.     dc.w    $4ef9            ; jmp
  454. old_interupt:    dc.l    0        ; the old int lev 3
  455.  
  456.  
  457.  
  458.  
  459.  
  460. setup_screen:
  461.     bsr    do_blit
  462.  
  463.     move.l    screen1,$dff054                ; dest mem d
  464.     move.w    #(%0001)*256,$dff040            ; blit cont reg 0
  465.     move.w    #%0000000000000100,$dff042        ; blit cont reg 1
  466.     move.w    #0,$dff066                ; modulo for dest
  467.     move.w    #(170*64)+20,$dff058            ; blit height,width
  468.  
  469.     bsr    do_blit
  470.  
  471.     move.l    screen1,a2
  472.     move.l    page,a1
  473.     add.l    #40*4,a2
  474.  
  475.     move.l    #0,lines
  476.  
  477. plot_again:
  478.     add.l    #1,lines
  479.     bsr    blit_message
  480.     add.l    #40*tall,a2
  481.  
  482.     move.b    (a1),d0
  483.     bne.s    plot_again
  484.  
  485.     move.l    #topcur,d1
  486.     move.l    lines,d0
  487.     sub.l    #5,d0
  488.     mulu    #tall*$100,d0
  489.     add.l    d0,d1
  490.     move.l    d1,maxlines
  491.     
  492.     move.l    lines,d0
  493.     sub.l    #1,d0
  494.     mulu    #10,d0
  495.     move.l    #256,d1
  496.     sub.l    d0,d1
  497.     move.l    d1,lines
  498.     
  499.     rts
  500.     
  501. blit_message:
  502.  
  503.     movem.l    d0-d7/a2-a6,-(sp)
  504.  
  505.     move.l    #0,midadd
  506.  
  507.     move.l    a1,a6
  508.     clr.b    d0
  509.     moveq.l    #-1,d1
  510.     
  511. blit_message_loop1:
  512.  
  513.     addq.l    #1,d1
  514.     move.b    (a6),d0
  515.     addq    #1,a6
  516.     cmp.b    #0,d0
  517.     bne.s    blit_message_loop1
  518.  
  519.     move.w    d1,d5
  520.     and.w    #1,d5
  521.     asl.w    #1,d5
  522.     move.w    d5,mid
  523.     
  524.     move.l    a2,midadd
  525.     move.w    d1,d5
  526.  
  527.     addq.l    #1,d1
  528.     lsr.l    #1,d1
  529.  
  530.     moveq.l    #20,d6            ; centre - lo res
  531.  
  532.     sub.l    d1,d6
  533.     add.l    d6,a2
  534.     move.l    a2,d2
  535.     and.l    #$fffffffe,d2
  536.     move.l    a2,d3
  537.     and.l    #1,d3
  538.     move.l    d2,a2
  539.     
  540.     move.w    #12,d6
  541.     cmp.l    #1,d3
  542.     beq.s    cont_blit_message
  543.     
  544.     add.w    #12,mid
  545.     subq.l    #2,midadd
  546.     
  547. cont_blit_message:
  548.     
  549.     move.w    d6,d7
  550.     mulu    #8192,d7
  551.     
  552.     subq.w    #4,d6
  553.     cmp.w    #4,d6
  554.     bne.s    other_half
  555.     
  556.     move.w    #12,d6
  557.     add.l    #80,a2
  558.     
  559. other_half:
  560.  
  561.     sub.l    #40,a2
  562.     clr.w    d0
  563.     lea    font,a0
  564.     move.b    (a1),d0
  565.     addq.l    #1,a1
  566.     cmp.b    #0,d0
  567.     bne.s    mess_is_ok
  568.  
  569.     movem.l    (sp)+,d0-d7/a2-a6    
  570.     
  571.     move.w    mid,d5
  572.     mulu    #8192,d5
  573.     or.w    #(%1001*256)+$f0,d5
  574.     
  575.     move.l    midadd,a3
  576.     jsr    do_blit
  577.     
  578.     Move.l    a3,$dff054        ; dest mem d
  579.     Move.l    a2,$dff050        ; source mem a
  580.     Move.w    #$ffff,$dff044        ; blit 1st word mask source a
  581.     move.w    #$ffff,$dff046        ; blit last word mask source a
  582.     move.w    #0,$dff064        ; blit modulo for source a
  583.     move.w    d5,$dff040
  584.     move.w    #0,$dff042        ; blit cont reg 1
  585.     Move.w    #0,$dff066        ; modulo for dest
  586.     Move.w    #(8*64)+40,$dff058    ; blit height,width
  587.  
  588.     jsr    do_blit
  589.  
  590. dont_centre:
  591.     rts
  592.     
  593.     
  594. mess_is_ok:
  595.  
  596.     cmp    #32,d0
  597.     beq    space
  598.  
  599.     sub    #32,d0
  600.     mulu    #16,d0
  601.     add    d0,a0
  602.     
  603.     Move.l    a2,$dff054        ; dest mem d
  604.     Move.l    a0,$dff050        ; source mem a
  605.     move.l    a2,$dff048        ; source mem c
  606.     Move.w    #$ffff,$dff044        ; blit 1st word mask source a
  607.     move.w    #$ffff,$dff046        ; blit last word mask source a
  608.     move.w    #0,$dff064        ; blit modulo for source a
  609.     move.w    #38,$dff060        ; blit modulo for source c    
  610.     or.w    #(%1011*256)+$fa,d7
  611.     move.w    d7,$dff040        ; blit cont reg 0
  612.     move.w    #0,$dff042        ; blit cont reg 1
  613.     Move.w    #38,$dff066        ; modulo for dest
  614.     Move.w    #(8*64)+1,d0        ; blit height,width
  615.     cmp.l    #12,d6
  616.     beq.s    not_12
  617.     Move.w    #(9*64)+1,d0
  618. not_12:    
  619.     move.w    d0,$dff058    ; blit height,width
  620.     jsr    do_blit
  621.     
  622. space:
  623.     
  624.     addq.l    #1,a2
  625.     bra    cont_blit_message
  626.  
  627. do_blit:
  628. wait_blit:
  629.     btst.b    #6,$dff002
  630.     bne.s    wait_blit
  631.     
  632.     rts
  633.  
  634.  
  635. ;********************************************
  636. ;* ----- Protracker V1.1B Playroutine ----- *
  637. ;* Lars "Zap" Hamre/Amiga Freelancers 1991  *
  638. ;* Bekkeliveien 10, N-2010 STRØMMEN, Norway *
  639. ;********************************************
  640.  
  641. ; VBlank Version 2:
  642. ; Call mt_init to initialize the routine, then call mt_music on
  643. ; each vertical blank (50 Hz). To end the song and turn off all
  644. ; voices, call mt_end.
  645.  
  646. ; This playroutine is not very fast, optimized or well commented,
  647. ; but all the new commands in PT1.1A should work.
  648. ; If it's not good enough, you'll have to change it yourself.
  649. ; We'll try to write a faster routine soon...
  650.  
  651. ; Changes from V1.0C playroutine:
  652. ; - Vibrato depth changed to be compatible with Noisetracker 2.0.
  653. ;   You'll have to double all vib. depths on old PT modules.
  654. ; - Funk Repeat changed to Invert Loop.
  655. ; - Period set back earlier when stopping an effect.
  656.  
  657. DMAWait = 300 ; Set this as low as possible without losing low notes.
  658.  
  659. n_note        EQU    0  ; W
  660. n_cmd        EQU    2  ; W
  661. n_cmdlo        EQU    3  ; B
  662. n_start        EQU    4  ; L
  663. n_length    EQU    8  ; W
  664. n_loopstart    EQU    10 ; L
  665. n_replen    EQU    14 ; W
  666. n_period    EQU    16 ; W
  667. n_finetune    EQU    18 ; B
  668. n_volume    EQU    19 ; B
  669. n_dmabit    EQU    20 ; W
  670. n_toneportdirec    EQU    22 ; B
  671. n_toneportspeed    EQU    23 ; B
  672. n_wantedperiod    EQU    24 ; W
  673. n_vibratocmd    EQU    26 ; B
  674. n_vibratopos    EQU    27 ; B
  675. n_tremolocmd    EQU    28 ; B
  676. n_tremolopos    EQU    29 ; B
  677. n_wavecontrol    EQU    30 ; B
  678. n_glissfunk    EQU    31 ; B
  679. n_sampleoffset    EQU    32 ; B
  680. n_pattpos    EQU    33 ; B
  681. n_loopcount    EQU    34 ; B
  682. n_funkoffset    EQU    35 ; B
  683. n_wavestart    EQU    36 ; L
  684. n_reallength    EQU    40 ; W
  685.  
  686. mt_init    LEA    mt_data,A0
  687.     MOVE.L    A0,mt_SongDataPtr
  688.     MOVE.L    A0,A1
  689.     LEA    952(A1),A1
  690.     MOVEQ    #127,D0
  691.     MOVEQ    #0,D1
  692. mtloop    MOVE.L    D1,D2
  693.     SUBQ.W    #1,D0
  694. mtloop2    MOVE.B    (A1)+,D1
  695.     CMP.B    D2,D1
  696.     BGT.S    mtloop
  697.     DBRA    D0,mtloop2
  698.     ADDQ.B    #1,D2
  699.             
  700.     LEA    mt_SampleStarts(PC),A1
  701.     ASL.L    #8,D2
  702.     ASL.L    #2,D2
  703.     ADD.L    #1084,D2
  704.     ADD.L    A0,D2
  705.     MOVE.L    D2,A2
  706.     MOVEQ    #30,D0
  707. mtloop3    CLR.L    (A2)
  708.     MOVE.L    A2,(A1)+
  709.     MOVEQ    #0,D1
  710.     MOVE.W    42(A0),D1
  711.     ASL.L    #1,D1
  712.     ADD.L    D1,A2
  713.     ADD.L    #30,A0
  714.     DBRA    D0,mtloop3
  715.  
  716.     OR.B    #2,$BFE001
  717.     MOVE.B    #6,mt_speed
  718.     CLR.B    mt_counter
  719.     CLR.B    mt_SongPos
  720.     CLR.W    mt_PatternPos
  721. mt_end    CLR.W    $DFF0A8
  722.     CLR.W    $DFF0B8
  723.     CLR.W    $DFF0C8
  724.     CLR.W    $DFF0D8
  725.     MOVE.W    #$F,$DFF096
  726.     RTS
  727.  
  728. mt_music
  729.     MOVEM.L    D0-D4/A0-A6,-(SP)
  730.     ADDQ.B    #1,mt_counter
  731.     MOVE.B    mt_counter(PC),D0
  732.     CMP.B    mt_speed(PC),D0
  733.     BLO.S    mt_NoNewNote
  734.     CLR.B    mt_counter
  735.     TST.B    mt_PattDelTime2
  736.     BEQ.S    mt_GetNewNote
  737.     BSR.S    mt_NoNewAllChannels
  738.     BRA    mt_dskip
  739.  
  740. mt_NoNewNote
  741.     BSR.S    mt_NoNewAllChannels
  742.     BRA    mt_NoNewPosYet
  743.  
  744. mt_NoNewAllChannels
  745.     LEA    $DFF0A0,A5
  746.     LEA    mt_chan1temp(PC),A6
  747.     BSR    mt_CheckEfx
  748.     LEA    $DFF0B0,A5
  749.     LEA    mt_chan2temp(PC),A6
  750.     BSR    mt_CheckEfx
  751.     LEA    $DFF0C0,A5
  752.     LEA    mt_chan3temp(PC),A6
  753.     BSR    mt_CheckEfx
  754.     LEA    $DFF0D0,A5
  755.     LEA    mt_chan4temp(PC),A6
  756.     BRA    mt_CheckEfx
  757.  
  758. mt_GetNewNote
  759.     MOVE.L    mt_SongDataPtr(PC),A0
  760.     LEA    12(A0),A3
  761.     LEA    952(A0),A2    ;pattpo
  762.     LEA    1084(A0),A0    ;patterndata
  763.     MOVEQ    #0,D0
  764.     MOVEQ    #0,D1
  765.     MOVE.B    mt_SongPos(PC),D0
  766.     MOVE.B    (A2,D0.W),D1
  767.     ASL.L    #8,D1
  768.     ASL.L    #2,D1
  769.     ADD.W    mt_PatternPos(PC),D1
  770.     CLR.W    mt_DMACONtemp
  771.  
  772.     LEA    $DFF0A0,A5
  773.     LEA    mt_chan1temp(PC),A6
  774.     BSR.S    mt_PlayVoice
  775.     LEA    $DFF0B0,A5
  776.     LEA    mt_chan2temp(PC),A6
  777.     BSR.S    mt_PlayVoice
  778.     LEA    $DFF0C0,A5
  779.     LEA    mt_chan3temp(PC),A6
  780.     BSR.S    mt_PlayVoice
  781.     LEA    $DFF0D0,A5
  782.     LEA    mt_chan4temp(PC),A6
  783.     BSR.S    mt_PlayVoice
  784.     BRA    mt_SetDMA
  785.  
  786. mt_PlayVoice
  787.     TST.L    (A6)
  788.     BNE.S    mt_plvskip
  789.     BSR    mt_PerNop
  790. mt_plvskip
  791.     MOVE.L    (A0,D1.L),(A6)
  792.     ADDQ.L    #4,D1
  793.     MOVEQ    #0,D2
  794.     MOVE.B    n_cmd(A6),D2
  795.     AND.B    #$F0,D2
  796.     LSR.B    #4,D2
  797.     MOVE.B    (A6),D0
  798.     AND.B    #$F0,D0
  799.     OR.B    D0,D2
  800.     TST.B    D2
  801.     BEQ    mt_SetRegs
  802.     MOVEQ    #0,D3
  803.     LEA    mt_SampleStarts(PC),A1
  804.     MOVE    D2,D4
  805.     SUBQ.L    #1,D2
  806.     ASL.L    #2,D2
  807.     MULU    #30,D4
  808.     MOVE.L    (A1,D2.L),n_start(A6)
  809.     MOVE.W    (A3,D4.L),n_length(A6)
  810.     MOVE.W    (A3,D4.L),n_reallength(A6)
  811.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  812.     MOVE.B    3(A3,D4.L),n_volume(A6)
  813.     MOVE.W    4(A3,D4.L),D3 ; Get repeat
  814.     TST.W    D3
  815.     BEQ.S    mt_NoLoop
  816.     MOVE.L    n_start(A6),D2    ; Get start
  817.     ASL.W    #1,D3
  818.     ADD.L    D3,D2        ; Add repeat
  819.     MOVE.L    D2,n_loopstart(A6)
  820.     MOVE.L    D2,n_wavestart(A6)
  821.     MOVE.W    4(A3,D4.L),D0    ; Get repeat
  822.     ADD.W    6(A3,D4.L),D0    ; Add replen
  823.     MOVE.W    D0,n_length(A6)
  824.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  825.     MOVEQ    #0,D0
  826.     MOVE.B    n_volume(A6),D0
  827.     MOVE.W    D0,8(A5)    ; Set volume
  828.     BRA.S    mt_SetRegs
  829.  
  830. mt_NoLoop
  831.     MOVE.L    n_start(A6),D2
  832.     ADD.L    D3,D2
  833.     MOVE.L    D2,n_loopstart(A6)
  834.     MOVE.L    D2,n_wavestart(A6)
  835.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  836.     MOVEQ    #0,D0
  837.     MOVE.B    n_volume(A6),D0
  838.     MOVE.W    D0,8(A5)    ; Set volume
  839. mt_SetRegs
  840.     MOVE.W    (A6),D0
  841.     AND.W    #$0FFF,D0
  842.     BEQ    mt_CheckMoreEfx    ; If no note
  843.     MOVE.W    2(A6),D0
  844.     AND.W    #$0FF0,D0
  845.     CMP.W    #$0E50,D0
  846.     BEQ.S    mt_DoSetFineTune
  847.     MOVE.B    2(A6),D0
  848.     AND.B    #$0F,D0
  849.     CMP.B    #3,D0    ; TonePortamento
  850.     BEQ.S    mt_ChkTonePorta
  851.     CMP.B    #5,D0
  852.     BEQ.S    mt_ChkTonePorta
  853.     CMP.B    #9,D0    ; Sample Offset
  854.     BNE.S    mt_SetPeriod
  855.     BSR    mt_CheckMoreEfx
  856.     BRA.S    mt_SetPeriod
  857.  
  858. mt_DoSetFineTune
  859.     BSR    mt_SetFineTune
  860.     BRA.S    mt_SetPeriod
  861.  
  862. mt_ChkTonePorta
  863.     BSR    mt_SetTonePorta
  864.     BRA    mt_CheckMoreEfx
  865.  
  866. mt_SetPeriod
  867.     MOVEM.L    D0-D1/A0-A1,-(SP)
  868.     MOVE.W    (A6),D1
  869.     AND.W    #$0FFF,D1
  870.     LEA    mt_PeriodTable(PC),A1
  871.     MOVEQ    #0,D0
  872.     MOVEQ    #36,D7
  873. mt_ftuloop
  874.     CMP.W    (A1,D0.W),D1
  875.     BHS.S    mt_ftufound
  876.     ADDQ.L    #2,D0
  877.     DBRA    D7,mt_ftuloop
  878. mt_ftufound
  879.     MOVEQ    #0,D1
  880.     MOVE.B    n_finetune(A6),D1
  881.     MULU    #36*2,D1
  882.     ADD.L    D1,A1
  883.     MOVE.W    (A1,D0.W),n_period(A6)
  884.     MOVEM.L    (SP)+,D0-D1/A0-A1
  885.  
  886.     MOVE.W    2(A6),D0
  887.     AND.W    #$0FF0,D0
  888.     CMP.W    #$0ED0,D0 ; Notedelay
  889.     BEQ    mt_CheckMoreEfx
  890.  
  891.     MOVE.W    n_dmabit(A6),$DFF096
  892.     BTST    #2,n_wavecontrol(A6)
  893.     BNE.S    mt_vibnoc
  894.     CLR.B    n_vibratopos(A6)
  895. mt_vibnoc
  896.     BTST    #6,n_wavecontrol(A6)
  897.     BNE.S    mt_trenoc
  898.     CLR.B    n_tremolopos(A6)
  899. mt_trenoc
  900.     MOVE.L    n_start(A6),(A5)    ; Set start
  901.     MOVE.W    n_length(A6),4(A5)    ; Set length
  902.     MOVE.W    n_period(A6),D0
  903.     MOVE.W    D0,6(A5)        ; Set period
  904.     MOVE.W    n_dmabit(A6),D0
  905.     OR.W    D0,mt_DMACONtemp
  906.     BRA    mt_CheckMoreEfx
  907.  
  908. mt_SetDMA
  909.     MOVE.W    #300,D0
  910. mt_WaitDMA
  911.     DBRA    D0,mt_WaitDMA
  912.     MOVE.W    mt_DMACONtemp(PC),D0
  913.     OR.W    #$8000,D0
  914.     MOVE.W    D0,$DFF096
  915.     MOVE.W    #300,D0
  916. mt_WaitDMA2
  917.     DBRA    D0,mt_WaitDMA2
  918.  
  919.     LEA    $DFF000,A5
  920.     LEA    mt_chan4temp(PC),A6
  921.     MOVE.L    n_loopstart(A6),$D0(A5)
  922.     MOVE.W    n_replen(A6),$D4(A5)
  923.     LEA    mt_chan3temp(PC),A6
  924.     MOVE.L    n_loopstart(A6),$C0(A5)
  925.     MOVE.W    n_replen(A6),$C4(A5)
  926.     LEA    mt_chan2temp(PC),A6
  927.     MOVE.L    n_loopstart(A6),$B0(A5)
  928.     MOVE.W    n_replen(A6),$B4(A5)
  929.     LEA    mt_chan1temp(PC),A6
  930.     MOVE.L    n_loopstart(A6),$A0(A5)
  931.     MOVE.W    n_replen(A6),$A4(A5)
  932.  
  933. mt_dskip
  934.     ADD.W    #16,mt_PatternPos
  935.     MOVE.B    mt_PattDelTime,D0
  936.     BEQ.S    mt_dskc
  937.     MOVE.B    D0,mt_PattDelTime2
  938.     CLR.B    mt_PattDelTime
  939. mt_dskc    TST.B    mt_PattDelTime2
  940.     BEQ.S    mt_dska
  941.     SUBQ.B    #1,mt_PattDelTime2
  942.     BEQ.S    mt_dska
  943.     SUB.W    #16,mt_PatternPos
  944. mt_dska    TST.B    mt_PBreakFlag
  945.     BEQ.S    mt_nnpysk
  946.     SF    mt_PBreakFlag
  947.     MOVEQ    #0,D0
  948.     MOVE.B    mt_PBreakPos(PC),D0
  949.     CLR.B    mt_PBreakPos
  950.     LSL.W    #4,D0
  951.     MOVE.W    D0,mt_PatternPos
  952. mt_nnpysk
  953.     CMP.W    #1024,mt_PatternPos
  954.     BLO.S    mt_NoNewPosYet
  955. mt_NextPosition    
  956.     MOVEQ    #0,D0
  957.     MOVE.B    mt_PBreakPos(PC),D0
  958.     LSL.W    #4,D0
  959.     MOVE.W    D0,mt_PatternPos
  960.     CLR.B    mt_PBreakPos
  961.     CLR.B    mt_PosJumpFlag
  962.     ADDQ.B    #1,mt_SongPos
  963.     AND.B    #$7F,mt_SongPos
  964.     MOVE.B    mt_SongPos(PC),D1
  965.     MOVE.L    mt_SongDataPtr(PC),A0
  966.     CMP.B    950(A0),D1
  967.     BLO.S    mt_NoNewPosYet
  968.     CLR.B    mt_SongPos
  969. mt_NoNewPosYet    
  970.     TST.B    mt_PosJumpFlag
  971.     BNE.S    mt_NextPosition
  972.     MOVEM.L    (SP)+,D0-D4/A0-A6
  973.     RTS
  974.  
  975. mt_CheckEfx
  976.     BSR    mt_UpdateFunk
  977.     MOVE.W    n_cmd(A6),D0
  978.     AND.W    #$0FFF,D0
  979.     BEQ.S    mt_PerNop
  980.     MOVE.B    n_cmd(A6),D0
  981.     AND.B    #$0F,D0
  982.     BEQ.S    mt_Arpeggio
  983.     CMP.B    #1,D0
  984.     BEQ    mt_PortaUp
  985.     CMP.B    #2,D0
  986.     BEQ    mt_PortaDown
  987.     CMP.B    #3,D0
  988.     BEQ    mt_TonePortamento
  989.     CMP.B    #4,D0
  990.     BEQ    mt_Vibrato
  991.     CMP.B    #5,D0
  992.     BEQ    mt_TonePlusVolSlide
  993.     CMP.B    #6,D0
  994.     BEQ    mt_VibratoPlusVolSlide
  995.     CMP.B    #$E,D0
  996.     BEQ    mt_E_Commands
  997. SetBack    MOVE.W    n_period(A6),6(A5)
  998.     CMP.B    #7,D0
  999.     BEQ    mt_Tremolo
  1000.     CMP.B    #$A,D0
  1001.     BEQ    mt_VolumeSlide
  1002. mt_Return2
  1003.     RTS
  1004.  
  1005. mt_PerNop
  1006.     MOVE.W    n_period(A6),6(A5)
  1007.     RTS
  1008.  
  1009. mt_Arpeggio
  1010.     MOVEQ    #0,D0
  1011.     MOVE.B    mt_counter(PC),D0
  1012.     DIVS    #3,D0
  1013.     SWAP    D0
  1014.     CMP.W    #0,D0
  1015.     BEQ.S    mt_Arpeggio2
  1016.     CMP.W    #2,D0
  1017.     BEQ.S    mt_Arpeggio1
  1018.     MOVEQ    #0,D0
  1019.     MOVE.B    n_cmdlo(A6),D0
  1020.     LSR.B    #4,D0
  1021.     BRA.S    mt_Arpeggio3
  1022.  
  1023. mt_Arpeggio1
  1024.     MOVEQ    #0,D0
  1025.     MOVE.B    n_cmdlo(A6),D0
  1026.     AND.B    #15,D0
  1027.     BRA.S    mt_Arpeggio3
  1028.  
  1029. mt_Arpeggio2
  1030.     MOVE.W    n_period(A6),D2
  1031.     BRA.S    mt_Arpeggio4
  1032.  
  1033. mt_Arpeggio3
  1034.     ASL.W    #1,D0
  1035.     MOVEQ    #0,D1
  1036.     MOVE.B    n_finetune(A6),D1
  1037.     MULU    #36*2,D1
  1038.     LEA    mt_PeriodTable(PC),A0
  1039.     ADD.L    D1,A0
  1040.     MOVEQ    #0,D1
  1041.     MOVE.W    n_period(A6),D1
  1042.     MOVEQ    #36,D7
  1043. mt_arploop
  1044.     MOVE.W    (A0,D0.W),D2
  1045.     CMP.W    (A0),D1
  1046.     BHS.S    mt_Arpeggio4
  1047.     ADDQ.L    #2,A0
  1048.     DBRA    D7,mt_arploop
  1049.     RTS
  1050.  
  1051. mt_Arpeggio4
  1052.     MOVE.W    D2,6(A5)
  1053.     RTS
  1054.  
  1055. mt_FinePortaUp
  1056.     TST.B    mt_counter
  1057.     BNE.S    mt_Return2
  1058.     MOVE.B    #$0F,mt_LowMask
  1059. mt_PortaUp
  1060.     MOVEQ    #0,D0
  1061.     MOVE.B    n_cmdlo(A6),D0
  1062.     AND.B    mt_LowMask(PC),D0
  1063.     MOVE.B    #$FF,mt_LowMask
  1064.     SUB.W    D0,n_period(A6)
  1065.     MOVE.W    n_period(A6),D0
  1066.     AND.W    #$0FFF,D0
  1067.     CMP.W    #113,D0
  1068.     BPL.S    mt_PortaUskip
  1069.     AND.W    #$F000,n_period(A6)
  1070.     OR.W    #113,n_period(A6)
  1071. mt_PortaUskip
  1072.     MOVE.W    n_period(A6),D0
  1073.     AND.W    #$0FFF,D0
  1074.     MOVE.W    D0,6(A5)
  1075.     RTS    
  1076.  
  1077. mt_FinePortaDown
  1078.     TST.B    mt_counter
  1079.     BNE    mt_Return2
  1080.     MOVE.B    #$0F,mt_LowMask
  1081. mt_PortaDown
  1082.     CLR.W    D0
  1083.     MOVE.B    n_cmdlo(A6),D0
  1084.     AND.B    mt_LowMask(PC),D0
  1085.     MOVE.B    #$FF,mt_LowMask
  1086.     ADD.W    D0,n_period(A6)
  1087.     MOVE.W    n_period(A6),D0
  1088.     AND.W    #$0FFF,D0
  1089.     CMP.W    #856,D0
  1090.     BMI.S    mt_PortaDskip
  1091.     AND.W    #$F000,n_period(A6)
  1092.     OR.W    #856,n_period(A6)
  1093. mt_PortaDskip
  1094.     MOVE.W    n_period(A6),D0
  1095.     AND.W    #$0FFF,D0
  1096.     MOVE.W    D0,6(A5)
  1097.     RTS
  1098.  
  1099. mt_SetTonePorta
  1100.     MOVE.L    A0,-(SP)
  1101.     MOVE.W    (A6),D2
  1102.     AND.W    #$0FFF,D2
  1103.     MOVEQ    #0,D0
  1104.     MOVE.B    n_finetune(A6),D0
  1105.     MULU    #37*2,D0
  1106.     LEA    mt_PeriodTable(PC),A0
  1107.     ADD.L    D0,A0
  1108.     MOVEQ    #0,D0
  1109. mt_StpLoop
  1110.     CMP.W    (A0,D0.W),D2
  1111.     BHS.S    mt_StpFound
  1112.     ADDQ.W    #2,D0
  1113.     CMP.W    #37*2,D0
  1114.     BLO.S    mt_StpLoop
  1115.     MOVEQ    #35*2,D0
  1116. mt_StpFound
  1117.     MOVE.B    n_finetune(A6),D2
  1118.     AND.B    #8,D2
  1119.     BEQ.S    mt_StpGoss
  1120.     TST.W    D0
  1121.     BEQ.S    mt_StpGoss
  1122.     SUBQ.W    #2,D0
  1123. mt_StpGoss
  1124.     MOVE.W    (A0,D0.W),D2
  1125.     MOVE.L    (SP)+,A0
  1126.     MOVE.W    D2,n_wantedperiod(A6)
  1127.     MOVE.W    n_period(A6),D0
  1128.     CLR.B    n_toneportdirec(A6)
  1129.     CMP.W    D0,D2
  1130.     BEQ.S    mt_ClearTonePorta
  1131.     BGE    mt_Return2
  1132.     MOVE.B    #1,n_toneportdirec(A6)
  1133.     RTS
  1134.  
  1135. mt_ClearTonePorta
  1136.     CLR.W    n_wantedperiod(A6)
  1137.     RTS
  1138.  
  1139. mt_TonePortamento
  1140.     MOVE.B    n_cmdlo(A6),D0
  1141.     BEQ.S    mt_TonePortNoChange
  1142.     MOVE.B    D0,n_toneportspeed(A6)
  1143.     CLR.B    n_cmdlo(A6)
  1144. mt_TonePortNoChange
  1145.     TST.W    n_wantedperiod(A6)
  1146.     BEQ    mt_Return2
  1147.     MOVEQ    #0,D0
  1148.     MOVE.B    n_toneportspeed(A6),D0
  1149.     TST.B    n_toneportdirec(A6)
  1150.     BNE.S    mt_TonePortaUp
  1151. mt_TonePortaDown
  1152.     ADD.W    D0,n_period(A6)
  1153.     MOVE.W    n_wantedperiod(A6),D0
  1154.     CMP.W    n_period(A6),D0
  1155.     BGT.S    mt_TonePortaSetPer
  1156.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  1157.     CLR.W    n_wantedperiod(A6)
  1158.     BRA.S    mt_TonePortaSetPer
  1159.  
  1160. mt_TonePortaUp
  1161.     SUB.W    D0,n_period(A6)
  1162.     MOVE.W    n_wantedperiod(A6),D0
  1163.     CMP.W    n_period(A6),D0
  1164.     BLT.S    mt_TonePortaSetPer
  1165.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  1166.     CLR.W    n_wantedperiod(A6)
  1167.  
  1168. mt_TonePortaSetPer
  1169.     MOVE.W    n_period(A6),D2
  1170.     MOVE.B    n_glissfunk(A6),D0
  1171.     AND.B    #$0F,D0
  1172.     BEQ.S    mt_GlissSkip
  1173.     MOVEQ    #0,D0
  1174.     MOVE.B    n_finetune(A6),D0
  1175.     MULU    #36*2,D0
  1176.     LEA    mt_PeriodTable(PC),A0
  1177.     ADD.L    D0,A0
  1178.     MOVEQ    #0,D0
  1179. mt_GlissLoop
  1180.     CMP.W    (A0,D0.W),D2
  1181.     BHS.S    mt_GlissFound
  1182.     ADDQ.W    #2,D0
  1183.     CMP.W    #36*2,D0
  1184.     BLO.S    mt_GlissLoop
  1185.     MOVEQ    #35*2,D0
  1186. mt_GlissFound
  1187.     MOVE.W    (A0,D0.W),D2
  1188. mt_GlissSkip
  1189.     MOVE.W    D2,6(A5) ; Set period
  1190.     RTS
  1191.  
  1192. mt_Vibrato
  1193.     MOVE.B    n_cmdlo(A6),D0
  1194.     BEQ.S    mt_Vibrato2
  1195.     MOVE.B    n_vibratocmd(A6),D2
  1196.     AND.B    #$0F,D0
  1197.     BEQ.S    mt_vibskip
  1198.     AND.B    #$F0,D2
  1199.     OR.B    D0,D2
  1200. mt_vibskip
  1201.     MOVE.B    n_cmdlo(A6),D0
  1202.     AND.B    #$F0,D0
  1203.     BEQ.S    mt_vibskip2
  1204.     AND.B    #$0F,D2
  1205.     OR.B    D0,D2
  1206. mt_vibskip2
  1207.     MOVE.B    D2,n_vibratocmd(A6)
  1208. mt_Vibrato2
  1209.     MOVE.B    n_vibratopos(A6),D0
  1210.     LEA    mt_VibratoTable(PC),A4
  1211.     LSR.W    #2,D0
  1212.     AND.W    #$001F,D0
  1213.     MOVEQ    #0,D2
  1214.     MOVE.B    n_wavecontrol(A6),D2
  1215.     AND.B    #$03,D2
  1216.     BEQ.S    mt_vib_sine
  1217.     LSL.B    #3,D0
  1218.     CMP.B    #1,D2
  1219.     BEQ.S    mt_vib_rampdown
  1220.     MOVE.B    #255,D2
  1221.     BRA.S    mt_vib_set
  1222. mt_vib_rampdown
  1223.     TST.B    n_vibratopos(A6)
  1224.     BPL.S    mt_vib_rampdown2
  1225.     MOVE.B    #255,D2
  1226.     SUB.B    D0,D2
  1227.     BRA.S    mt_vib_set
  1228. mt_vib_rampdown2
  1229.     MOVE.B    D0,D2
  1230.     BRA.S    mt_vib_set
  1231. mt_vib_sine
  1232.     MOVE.B    0(A4,D0.W),D2
  1233. mt_vib_set
  1234.     MOVE.B    n_vibratocmd(A6),D0
  1235.     AND.W    #15,D0
  1236.     MULU    D0,D2
  1237.     LSR.W    #7,D2
  1238.     MOVE.W    n_period(A6),D0
  1239.     TST.B    n_vibratopos(A6)
  1240.     BMI.S    mt_VibratoNeg
  1241.     ADD.W    D2,D0
  1242.     BRA.S    mt_Vibrato3
  1243. mt_VibratoNeg
  1244.     SUB.W    D2,D0
  1245. mt_Vibrato3
  1246.     MOVE.W    D0,6(A5)
  1247.     MOVE.B    n_vibratocmd(A6),D0
  1248.     LSR.W    #2,D0
  1249.     AND.W    #$003C,D0
  1250.     ADD.B    D0,n_vibratopos(A6)
  1251.     RTS
  1252.  
  1253. mt_TonePlusVolSlide
  1254.     BSR    mt_TonePortNoChange
  1255.     BRA    mt_VolumeSlide
  1256.  
  1257. mt_VibratoPlusVolSlide
  1258.     BSR.S    mt_Vibrato2
  1259.     BRA    mt_VolumeSlide
  1260.  
  1261. mt_Tremolo
  1262.     MOVE.B    n_cmdlo(A6),D0
  1263.     BEQ.S    mt_Tremolo2
  1264.     MOVE.B    n_tremolocmd(A6),D2
  1265.     AND.B    #$0F,D0
  1266.     BEQ.S    mt_treskip
  1267.     AND.B    #$F0,D2
  1268.     OR.B    D0,D2
  1269. mt_treskip
  1270.     MOVE.B    n_cmdlo(A6),D0
  1271.     AND.B    #$F0,D0
  1272.     BEQ.S    mt_treskip2
  1273.     AND.B    #$0F,D2
  1274.     OR.B    D0,D2
  1275. mt_treskip2
  1276.     MOVE.B    D2,n_tremolocmd(A6)
  1277. mt_Tremolo2
  1278.     MOVE.B    n_tremolopos(A6),D0
  1279.     LEA    mt_VibratoTable(PC),A4
  1280.     LSR.W    #2,D0
  1281.     AND.W    #$001F,D0
  1282.     MOVEQ    #0,D2
  1283.     MOVE.B    n_wavecontrol(A6),D2
  1284.     LSR.B    #4,D2
  1285.     AND.B    #$03,D2
  1286.     BEQ.S    mt_tre_sine
  1287.     LSL.B    #3,D0
  1288.     CMP.B    #1,D2
  1289.     BEQ.S    mt_tre_rampdown
  1290.     MOVE.B    #255,D2
  1291.     BRA.S    mt_tre_set
  1292. mt_tre_rampdown
  1293.     TST.B    n_vibratopos(A6)
  1294.     BPL.S    mt_tre_rampdown2
  1295.     MOVE.B    #255,D2
  1296.     SUB.B    D0,D2
  1297.     BRA.S    mt_tre_set
  1298. mt_tre_rampdown2
  1299.     MOVE.B    D0,D2
  1300.     BRA.S    mt_tre_set
  1301. mt_tre_sine
  1302.     MOVE.B    0(A4,D0.W),D2
  1303. mt_tre_set
  1304.     MOVE.B    n_tremolocmd(A6),D0
  1305.     AND.W    #15,D0
  1306.     MULU    D0,D2
  1307.     LSR.W    #6,D2
  1308.     MOVEQ    #0,D0
  1309.     MOVE.B    n_volume(A6),D0
  1310.     TST.B    n_tremolopos(A6)
  1311.     BMI.S    mt_TremoloNeg
  1312.     ADD.W    D2,D0
  1313.     BRA.S    mt_Tremolo3
  1314. mt_TremoloNeg
  1315.     SUB.W    D2,D0
  1316. mt_Tremolo3
  1317.     BPL.S    mt_TremoloSkip
  1318.     CLR.W    D0
  1319. mt_TremoloSkip
  1320.     CMP.W    #$40,D0
  1321.     BLS.S    mt_TremoloOk
  1322.     MOVE.W    #$40,D0
  1323. mt_TremoloOk
  1324.     MOVE.W    D0,8(A5)
  1325.     MOVE.B    n_tremolocmd(A6),D0
  1326.     LSR.W    #2,D0
  1327.     AND.W    #$003C,D0
  1328.     ADD.B    D0,n_tremolopos(A6)
  1329.     RTS
  1330.  
  1331. mt_SampleOffset
  1332.     MOVEQ    #0,D0
  1333.     MOVE.B    n_cmdlo(A6),D0
  1334.     BEQ.S    mt_sononew
  1335.     MOVE.B    D0,n_sampleoffset(A6)
  1336. mt_sononew
  1337.     MOVE.B    n_sampleoffset(A6),D0
  1338.     LSL.W    #7,D0
  1339.     CMP.W    n_length(A6),D0
  1340.     BGE.S    mt_sofskip
  1341.     SUB.W    D0,n_length(A6)
  1342.     LSL.W    #1,D0
  1343.     ADD.L    D0,n_start(A6)
  1344.     RTS
  1345. mt_sofskip
  1346.     MOVE.W    #$0001,n_length(A6)
  1347.     RTS
  1348.  
  1349. mt_VolumeSlide
  1350.     MOVEQ    #0,D0
  1351.     MOVE.B    n_cmdlo(A6),D0
  1352.     LSR.B    #4,D0
  1353.     TST.B    D0
  1354.     BEQ.S    mt_VolSlideDown
  1355. mt_VolSlideUp
  1356.     ADD.B    D0,n_volume(A6)
  1357.     CMP.B    #$40,n_volume(A6)
  1358.     BMI.S    mt_vsuskip
  1359.     MOVE.B    #$40,n_volume(A6)
  1360. mt_vsuskip
  1361.     MOVE.B    n_volume(A6),D0
  1362.     MOVE.W    D0,8(A5)
  1363.     RTS
  1364.  
  1365. mt_VolSlideDown
  1366.     MOVEQ    #0,D0
  1367.     MOVE.B    n_cmdlo(A6),D0
  1368.     AND.B    #$0F,D0
  1369. mt_VolSlideDown2
  1370.     SUB.B    D0,n_volume(A6)
  1371.     BPL.S    mt_vsdskip
  1372.     CLR.B    n_volume(A6)
  1373. mt_vsdskip
  1374.     MOVE.B    n_volume(A6),D0
  1375.     MOVE.W    D0,8(A5)
  1376.     RTS
  1377.  
  1378. mt_PositionJump
  1379.     MOVE.B    n_cmdlo(A6),D0
  1380.     SUBQ.B    #1,D0
  1381.     MOVE.B    D0,mt_SongPos
  1382. mt_pj2    CLR.B    mt_PBreakPos
  1383.     ST     mt_PosJumpFlag
  1384.     RTS
  1385.  
  1386. mt_VolumeChange
  1387.     MOVEQ    #0,D0
  1388.     MOVE.B    n_cmdlo(A6),D0
  1389.     CMP.B    #$40,D0
  1390.     BLS.S    mt_VolumeOk
  1391.     MOVEQ    #$40,D0
  1392. mt_VolumeOk
  1393.     MOVE.B    D0,n_volume(A6)
  1394.     MOVE.W    D0,8(A5)
  1395.     RTS
  1396.  
  1397. mt_PatternBreak
  1398.     MOVEQ    #0,D0
  1399.     MOVE.B    n_cmdlo(A6),D0
  1400.     MOVE.L    D0,D2
  1401.     LSR.B    #4,D0
  1402.     MULU    #10,D0
  1403.     AND.B    #$0F,D2
  1404.     ADD.B    D2,D0
  1405.     CMP.B    #63,D0
  1406.     BHI.S    mt_pj2
  1407.     MOVE.B    D0,mt_PBreakPos
  1408.     ST    mt_PosJumpFlag
  1409.     RTS
  1410.  
  1411. mt_SetSpeed
  1412.     MOVE.B    3(A6),D0
  1413.     BEQ    mt_Return2
  1414.     CLR.B    mt_counter
  1415.     MOVE.B    D0,mt_speed
  1416.     RTS
  1417.  
  1418. mt_CheckMoreEfx
  1419.     BSR    mt_UpdateFunk
  1420.     MOVE.B    2(A6),D0
  1421.     AND.B    #$0F,D0
  1422.     CMP.B    #$9,D0
  1423.     BEQ    mt_SampleOffset
  1424.     CMP.B    #$B,D0
  1425.     BEQ    mt_PositionJump
  1426.     CMP.B    #$D,D0
  1427.     BEQ.S    mt_PatternBreak
  1428.     CMP.B    #$E,D0
  1429.     BEQ.S    mt_E_Commands
  1430.     CMP.B    #$F,D0
  1431.     BEQ.S    mt_SetSpeed
  1432.     CMP.B    #$C,D0
  1433.     BEQ    mt_VolumeChange
  1434.     BRA    mt_PerNop
  1435.  
  1436. mt_E_Commands
  1437.     MOVE.B    n_cmdlo(A6),D0
  1438.     AND.B    #$F0,D0
  1439.     LSR.B    #4,D0
  1440.     BEQ.S    mt_FilterOnOff
  1441.     CMP.B    #1,D0
  1442.     BEQ    mt_FinePortaUp
  1443.     CMP.B    #2,D0
  1444.     BEQ    mt_FinePortaDown
  1445.     CMP.B    #3,D0
  1446.     BEQ.S    mt_SetGlissControl
  1447.     CMP.B    #4,D0
  1448.     BEQ    mt_SetVibratoControl
  1449.     CMP.B    #5,D0
  1450.     BEQ    mt_SetFineTune
  1451.     CMP.B    #6,D0
  1452.     BEQ    mt_JumpLoop
  1453.     CMP.B    #7,D0
  1454.     BEQ    mt_SetTremoloControl
  1455.     CMP.B    #9,D0
  1456.     BEQ    mt_RetrigNote
  1457.     CMP.B    #$A,D0
  1458.     BEQ    mt_VolumeFineUp
  1459.     CMP.B    #$B,D0
  1460.     BEQ    mt_VolumeFineDown
  1461.     CMP.B    #$C,D0
  1462.     BEQ    mt_NoteCut
  1463.     CMP.B    #$D,D0
  1464.     BEQ    mt_NoteDelay
  1465.     CMP.B    #$E,D0
  1466.     BEQ    mt_PatternDelay
  1467.     CMP.B    #$F,D0
  1468.     BEQ    mt_FunkIt
  1469.     RTS
  1470.  
  1471. mt_FilterOnOff
  1472.     MOVE.B    n_cmdlo(A6),D0
  1473.     AND.B    #1,D0
  1474.     ASL.B    #1,D0
  1475.     AND.B    #$FD,$BFE001
  1476.     OR.B    D0,$BFE001
  1477.     RTS    
  1478.  
  1479. mt_SetGlissControl
  1480.     MOVE.B    n_cmdlo(A6),D0
  1481.     AND.B    #$0F,D0
  1482.     AND.B    #$F0,n_glissfunk(A6)
  1483.     OR.B    D0,n_glissfunk(A6)
  1484.     RTS
  1485.  
  1486. mt_SetVibratoControl
  1487.     MOVE.B    n_cmdlo(A6),D0
  1488.     AND.B    #$0F,D0
  1489.     AND.B    #$F0,n_wavecontrol(A6)
  1490.     OR.B    D0,n_wavecontrol(A6)
  1491.     RTS
  1492.  
  1493. mt_SetFineTune
  1494.     MOVE.B    n_cmdlo(A6),D0
  1495.     AND.B    #$0F,D0
  1496.     MOVE.B    D0,n_finetune(A6)
  1497.     RTS
  1498.  
  1499. mt_JumpLoop
  1500.     TST.B    mt_counter
  1501.     BNE    mt_Return2
  1502.     MOVE.B    n_cmdlo(A6),D0
  1503.     AND.B    #$0F,D0
  1504.     BEQ.S    mt_SetLoop
  1505.     TST.B    n_loopcount(A6)
  1506.     BEQ.S    mt_jumpcnt
  1507.     SUBQ.B    #1,n_loopcount(A6)
  1508.     BEQ    mt_Return2
  1509. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  1510.     ST    mt_PBreakFlag
  1511.     RTS
  1512.  
  1513. mt_jumpcnt
  1514.     MOVE.B    D0,n_loopcount(A6)
  1515.     BRA.S    mt_jmploop
  1516.  
  1517. mt_SetLoop
  1518.     MOVE.W    mt_PatternPos(PC),D0
  1519.     LSR.W    #4,D0
  1520.     MOVE.B    D0,n_pattpos(A6)
  1521.     RTS
  1522.  
  1523. mt_SetTremoloControl
  1524.     MOVE.B    n_cmdlo(A6),D0
  1525.     AND.B    #$0F,D0
  1526.     LSL.B    #4,D0
  1527.     AND.B    #$0F,n_wavecontrol(A6)
  1528.     OR.B    D0,n_wavecontrol(A6)
  1529.     RTS
  1530.  
  1531. mt_RetrigNote
  1532.     MOVE.L    D1,-(SP)
  1533.     MOVEQ    #0,D0
  1534.     MOVE.B    n_cmdlo(A6),D0
  1535.     AND.B    #$0F,D0
  1536.     BEQ.S    mt_rtnend
  1537.     MOVEQ    #0,D1
  1538.     MOVE.B    mt_counter(PC),D1
  1539.     BNE.S    mt_rtnskp
  1540.     MOVE.W    (A6),D1
  1541.     AND.W    #$0FFF,D1
  1542.     BNE.S    mt_rtnend
  1543.     MOVEQ    #0,D1
  1544.     MOVE.B    mt_counter(PC),D1
  1545. mt_rtnskp
  1546.     DIVU    D0,D1
  1547.     SWAP    D1
  1548.     TST.W    D1
  1549.     BNE.S    mt_rtnend
  1550. mt_DoRetrig
  1551.     MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1552.     MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1553.     MOVE.W    n_length(A6),4(A5)    ; Set length
  1554.     MOVE.W    #300,D0
  1555. mt_rtnloop1
  1556.     DBRA    D0,mt_rtnloop1
  1557.     MOVE.W    n_dmabit(A6),D0
  1558.     BSET    #15,D0
  1559.     MOVE.W    D0,$DFF096
  1560.     MOVE.W    #300,D0
  1561. mt_rtnloop2
  1562.     DBRA    D0,mt_rtnloop2
  1563.     MOVE.L    n_loopstart(A6),(A5)
  1564.     MOVE.L    n_replen(A6),4(A5)
  1565. mt_rtnend
  1566.     MOVE.L    (SP)+,D1
  1567.     RTS
  1568.  
  1569. mt_VolumeFineUp
  1570.     TST.B    mt_counter
  1571.     BNE    mt_Return2
  1572.     MOVEQ    #0,D0
  1573.     MOVE.B    n_cmdlo(A6),D0
  1574.     AND.B    #$F,D0
  1575.     BRA    mt_VolSlideUp
  1576.  
  1577. mt_VolumeFineDown
  1578.     TST.B    mt_counter
  1579.     BNE    mt_Return2
  1580.     MOVEQ    #0,D0
  1581.     MOVE.B    n_cmdlo(A6),D0
  1582.     AND.B    #$0F,D0
  1583.     BRA    mt_VolSlideDown2
  1584.  
  1585. mt_NoteCut
  1586.     MOVEQ    #0,D0
  1587.     MOVE.B    n_cmdlo(A6),D0
  1588.     AND.B    #$0F,D0
  1589.     CMP.B    mt_counter(PC),D0
  1590.     BNE    mt_Return2
  1591.     CLR.B    n_volume(A6)
  1592.     MOVE.W    #0,8(A5)
  1593.     RTS
  1594.  
  1595. mt_NoteDelay
  1596.     MOVEQ    #0,D0
  1597.     MOVE.B    n_cmdlo(A6),D0
  1598.     AND.B    #$0F,D0
  1599.     CMP.B    mt_Counter,D0
  1600.     BNE    mt_Return2
  1601.     MOVE.W    (A6),D0
  1602.     BEQ    mt_Return2
  1603.     MOVE.L    D1,-(SP)
  1604.     BRA    mt_DoRetrig
  1605.  
  1606. mt_PatternDelay
  1607.     TST.B    mt_counter
  1608.     BNE    mt_Return2
  1609.     MOVEQ    #0,D0
  1610.     MOVE.B    n_cmdlo(A6),D0
  1611.     AND.B    #$0F,D0
  1612.     TST.B    mt_PattDelTime2
  1613.     BNE    mt_Return2
  1614.     ADDQ.B    #1,D0
  1615.     MOVE.B    D0,mt_PattDelTime
  1616.     RTS
  1617.  
  1618. mt_FunkIt
  1619.     TST.B    mt_counter
  1620.     BNE    mt_Return2
  1621.     MOVE.B    n_cmdlo(A6),D0
  1622.     AND.B    #$0F,D0
  1623.     LSL.B    #4,D0
  1624.     AND.B    #$0F,n_glissfunk(A6)
  1625.     OR.B    D0,n_glissfunk(A6)
  1626.     TST.B    D0
  1627.     BEQ    mt_Return2
  1628. mt_UpdateFunk
  1629.     MOVEM.L    A0/D1,-(SP)
  1630.     MOVEQ    #0,D0
  1631.     MOVE.B    n_glissfunk(A6),D0
  1632.     LSR.B    #4,D0
  1633.     BEQ.S    mt_funkend
  1634.     LEA    mt_FunkTable(PC),A0
  1635.     MOVE.B    (A0,D0.W),D0
  1636.     ADD.B    D0,n_funkoffset(A6)
  1637.     BTST    #7,n_funkoffset(A6)
  1638.     BEQ.S    mt_funkend
  1639.     CLR.B    n_funkoffset(A6)
  1640.  
  1641.     MOVE.L    n_loopstart(A6),D0
  1642.     MOVEQ    #0,D1
  1643.     MOVE.W    n_replen(A6),D1
  1644.     ADD.L    D1,D0
  1645.     ADD.L    D1,D0
  1646.     MOVE.L    n_wavestart(A6),A0
  1647.     ADDQ.L    #1,A0
  1648.     CMP.L    D0,A0
  1649.     BLO.S    mt_funkok
  1650.     MOVE.L    n_loopstart(A6),A0
  1651. mt_funkok
  1652.     MOVE.L    A0,n_wavestart(A6)
  1653.     MOVEQ    #-1,D0
  1654.     SUB.B    (A0),D0
  1655.     MOVE.B    D0,(A0)
  1656. mt_funkend
  1657.     MOVEM.L    (SP)+,A0/D1
  1658.     RTS
  1659.  
  1660.  
  1661. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1662.  
  1663. mt_VibratoTable    
  1664.     dc.b   0, 24, 49, 74, 97,120,141,161
  1665.     dc.b 180,197,212,224,235,244,250,253
  1666.     dc.b 255,253,250,244,235,224,212,197
  1667.     dc.b 180,161,141,120, 97, 74, 49, 24
  1668.  
  1669. mt_PeriodTable
  1670. ; Tuning 0, Normal
  1671.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1672.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1673.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1674. ; Tuning 1
  1675.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1676.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1677.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1678. ; Tuning 2
  1679.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1680.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1681.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1682. ; Tuning 3
  1683.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1684.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1685.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1686. ; Tuning 4
  1687.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1688.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1689.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1690. ; Tuning 5
  1691.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1692.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1693.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1694. ; Tuning 6
  1695.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1696.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1697.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1698. ; Tuning 7
  1699.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1700.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1701.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1702. ; Tuning -8
  1703.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1704.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1705.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1706. ; Tuning -7
  1707.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1708.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1709.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1710. ; Tuning -6
  1711.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1712.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1713.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1714. ; Tuning -5
  1715.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1716.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1717.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1718. ; Tuning -4
  1719.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1720.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1721.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1722. ; Tuning -3
  1723.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1724.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1725.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1726. ; Tuning -2
  1727.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1728.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1729.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1730. ; Tuning -1
  1731.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1732.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1733.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1734.  
  1735. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0
  1736. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0
  1737. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0
  1738. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0
  1739.  
  1740. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1741.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1742.  
  1743. mt_SongDataPtr    dc.l 0
  1744.  
  1745. mt_speed    dc.b 6
  1746. mt_counter    dc.b 0
  1747. mt_SongPos    dc.b 0
  1748. mt_PBreakPos    dc.b 0
  1749. mt_PosJumpFlag    dc.b 0
  1750. mt_PBreakFlag    dc.b 0
  1751. mt_LowMask    dc.b 0
  1752. mt_PattDelTime    dc.b 0
  1753. mt_PattDelTime2    dc.b 0,0
  1754.  
  1755. mt_PatternPos    dc.w 0
  1756. mt_DMACONtemp    dc.w 0
  1757.  
  1758. ;/* End of File */
  1759.  
  1760.     
  1761.     
  1762.     Section    copdat,Data_C
  1763.  
  1764. old_copper:    dc.l    0
  1765. graphics:    dc.l    0
  1766.  
  1767. my_copper:    dc.w    $100,$4200    ; 4 bp - lo res
  1768.         dc.w    $104,$a        ; bp control reg
  1769.         dc.w    $108,0        ; bp modulo - odd
  1770.         dc.w    $10a,0        ; bp modulo - even
  1771.         dc.w    $180,0        ; colour 0 to black
  1772.         dc.w    $102,0
  1773.         
  1774.         dc.w    $08e,$287b    ; bp window start left
  1775.         dc.w    $090,$2fc1    ; bp window bot right
  1776.         dc.w    $94,$d0        ; bp stop horz
  1777.         dc.w    $92,$38
  1778.         dc.w    $120,0,$122,0
  1779.         dc.w    $124,0,$126,0
  1780.         dc.w    $128,0,$12a,0
  1781.         dc.w    $12c,0,$12e,0
  1782.         dc.w    $130,0,$132,0
  1783.         dc.w    $134,0,$136,0
  1784.         dc.w    $138,0,$13a,0
  1785.         dc.w    $13c,0,$13e,0
  1786.  
  1787.         
  1788. logocmap:    dc.w    $180,$0
  1789.         dc.w    $182,$0
  1790.         dc.w    $184,$0
  1791.         dc.w    $186,$0
  1792.         dc.w    $188,$0
  1793.         dc.w    $18a,$0
  1794.         dc.w    $18c,$0
  1795.         dc.w    $18e,$0
  1796.         dc.w    $190,$0
  1797.         dc.w    $192,$0
  1798.         dc.w    $194,$0
  1799.         dc.w    $196,$0
  1800.         dc.w    $198,$0
  1801.         dc.w    $19a,$0
  1802.         dc.w    $19c,$0
  1803.         dc.w    $19e,$0
  1804.  
  1805.         dc.w      $e0
  1806. bplane0_hi:    dc.w    0,$e2
  1807. bplane0_lo:    dc.w    0,$e4
  1808. bplane1_hi:    dc.w    0,$e6
  1809. bplane1_lo:    dc.w    0,$e8
  1810. bplane2_hi:    dc.w    0,$ea
  1811. bplane2_lo:    dc.w    0,$ec
  1812. bplane3_hi:    dc.w    0,$ee
  1813. bplane3_lo:    dc.w    0
  1814.  
  1815.         dc.w    $5a01,$ff00
  1816.         dc.w    $100,$1200
  1817.  
  1818.         dc.w    $5b07,$fffe
  1819.         curvecopper
  1820.         dc.w    $5c07,$fffe,$180,$000
  1821.  
  1822.         
  1823.         dc.w      $e0
  1824. bitplane0_hi:    dc.w    0,$e2
  1825. bitplane0_lo:    dc.w    0
  1826.         
  1827.         dc.w    $180,$000
  1828.         dc.w    $182,$fff
  1829.  
  1830. a set topcur
  1831. cursor1:    dc.w    a+$000,$fffe
  1832.         dc.w    $180,$444
  1833.         
  1834.         dc.w    $182,linecol
  1835.         
  1836. cursor2:    dc.w    a+$100,$fffe
  1837.         dc.w    $180,$666
  1838. cursor3:    dc.w    a+$200,$fffe
  1839.         dc.w    $180,$888
  1840. cursor4:    dc.w    a+$300,$fffe
  1841.         dc.w    $180,$aaa
  1842. cursor5:    dc.w    a+$400,$fffe
  1843.         dc.w    $180,$ccc
  1844. cursor6:    dc.w    a+$500,$fffe
  1845.         dc.w    $180,$eee
  1846. cursor7:    dc.w    a+$600,$fffe
  1847.         dc.w    $180,$ccc
  1848. cursor8:    dc.w    a+$700,$fffe
  1849.         dc.w    $180,$aaa
  1850. cursor9:    dc.w    a+$800,$fffe
  1851.         dc.w    $180,$888
  1852. cursor10:    dc.w    a+$900,$fffe
  1853.         dc.w    $180,$666
  1854. cursor11:    dc.w    a+$a00,$fffe
  1855.         dc.w    $180,$444
  1856. cursor12:    dc.w    a+$b00,$fffe
  1857.         dc.w    $180,$000
  1858.  
  1859.         dc.w    $182,$fff
  1860.  
  1861.         dc.w    $fe01,$ff00,$9c,$8010    ; strobe copper
  1862.         
  1863.         dc.w    $ffe1,$fffe        ; end of ntsc screen
  1864.         
  1865.         dc.w    $0007,$fffe
  1866.         curvecopper
  1867.         dc.w    $0107,$fffe,$180,$000,$100,$0200
  1868.  
  1869. logocmap2:    dc.w    $180,$0
  1870.         dc.w    $182,$0
  1871.         dc.w    $184,$0
  1872.         dc.w    $186,$0
  1873.         dc.w    $188,$0
  1874.         dc.w    $18a,$0
  1875.         dc.w    $18c,$0
  1876.         dc.w    $18e,$0
  1877.         dc.w    $190,$0
  1878.         dc.w    $192,$0
  1879.         dc.w    $194,$0
  1880.         dc.w    $196,$0
  1881.         dc.w    $198,$0
  1882.         dc.w    $19a,$0
  1883.         dc.w    $19c,$0
  1884.         dc.w    $19e,$0
  1885.  
  1886.         IFNE    havebottomlogo
  1887.  
  1888.         dc.w    $0201,$ff00,$100,$4200
  1889.         dc.w    $108,-80,$10a,-80
  1890.  
  1891.  
  1892.         dc.w      $e0
  1893. blane0_hi:    dc.w    0,$e2
  1894. blane0_lo:    dc.w    0,$e4
  1895. blane1_hi:    dc.w    0,$e6
  1896. blane1_lo:    dc.w    0,$e8
  1897. blane2_hi:    dc.w    0,$ea
  1898. blane2_lo:    dc.w    0,$ec
  1899. blane3_hi:    dc.w    0,$ee
  1900. blane3_lo:    dc.w    0
  1901.  
  1902.         dc.w    ((2+50-bottomlogo)*$100)+$01,$ff00,$100,$0200
  1903.  
  1904.         ENDC
  1905.  
  1906.         dc.w    $3001,$fffe    ; end of pal screen
  1907.         dc.w    $ffff,$fffe    ; end of copper list
  1908.  
  1909.  
  1910.  
  1911. font:        incbin    "keff04.wrd"
  1912.  
  1913. logo:        incbin    "logo.bin"
  1914.  
  1915.  
  1916.         ;**********************************
  1917.         ;********   module name  **********
  1918.         ;**********************************
  1919.         
  1920. mt_data:    incbin    "mod.bighippysmell.mub"
  1921.         dc.l    $12345678    ; rem the above line for no module
  1922.  
  1923.     section    miscdata,data
  1924.         
  1925. down        equ    256
  1926. wide:        equ    40
  1927.     
  1928. maxx:        equ    24
  1929.     
  1930. screen:        dc.l    0
  1931. screen1:    dc.l    0
  1932. screen2:    dc.l    0 
  1933.         
  1934. mid:        dc.l    0
  1935. midadd:        dc.l    0
  1936. page:        dc.l    0
  1937.  
  1938. glib:        dc.b    "graphics.library",0
  1939. doslib:        dc.b    "dos.library",0
  1940.     even
  1941.     
  1942. scrollmask:    dc.l    0
  1943. delay:        dc.l    400
  1944. maxlines:    dc.l    0
  1945. lines:        dc.l    0
  1946. ypos:        dc.l    256
  1947. xpos:        dc.l    0
  1948. oldy:        dc.l    0
  1949. yp:        dc.l    0
  1950. quit:        dc.l    0
  1951. step:        dc.l    0
  1952. oldintena:    dc.w    0
  1953. oldintreq:    dc.w    0
  1954.  
  1955. filename:    dc.l    0
  1956.  
  1957. dosbase:    dc.l    0
  1958.     
  1959.  
  1960.  
  1961.     
  1962. flist:    dc.l    file1    
  1963.     dc.l    file2
  1964.     dc.l    file3    
  1965.     dc.l    file4    
  1966.     dc.l    file5    
  1967.     dc.l    file6    
  1968.     dc.l    file7    
  1969.     dc.l    file8    
  1970.     dc.l    file9    
  1971.     dc.l    file10    
  1972.     dc.l    file11
  1973.     dc.l    file12
  1974.     dc.l    file13
  1975.     dc.l    file14
  1976.     dc.l    file15
  1977.     dc.l    file16
  1978.     
  1979.         
  1980. page1:    
  1981.  
  1982.     ; this is the text displayed on the menu.
  1983.     ; each line must finish with ,0
  1984.     ; for a blank line use dc.b " ",0 not dc.b "",0
  1985.     ; each of the following lines will be displayed on screen
  1986.     ; and corresponds to the list of filenames explained next.
  1987.  
  1988.     
  1989.     dc.b    "--- FREE MENU ---",0        ; not selectable, see next section
  1990.     dc.b    " ",0                ; not selectable, see next section    
  1991.     dc.b    "Our first Demo",0        ; text for 1st selectable item
  1992.     dc.b    "Yet another Intro",0        ; text for 2nd selectable item
  1993.     dc.b    "Crappy Game",0            ; etc.
  1994.     dc.b    " ",0                ; these lines onwards are not used
  1995.     dc.b    "You can put",0            ; in this example!
  1996.     dc.b    "as many",0
  1997.     dc.b    "files",0
  1998.     dc.b    "on this menu",0
  1999.     dc.b    "as you want",0
  2000.     dc.b    " ",0
  2001.     dc.b    "Up to sixteen",0
  2002.     dc.b    "items",0
  2003.     dc.b    " ",0
  2004.     dc.b    " ",0
  2005.  
  2006.  
  2007.     dc.b    0,0                ; end of text
  2008.     even
  2009.     
  2010.     ; this is the list of filename (see above)
  2011.     ; these must always end in ,0
  2012.     ; if you want an un-selectable item on the menu such as a title
  2013.     ; use dc.b "",0
  2014.     ; if you want the menu to quit on a certain file use run
  2015.     ; i.e. dc.b "run megademo",0 will cause the menu to de-allocate
  2016.     ; all the memory it uses before running `megademo'
  2017.     ; this is useful if the program to be run requires alot of memory
  2018.         
  2019.  
  2020. file1:    dc.b    "",0                ; this item not selectable
  2021.     even 
  2022. file2:    dc.b    "",0                ; this item not selectable
  2023.     even
  2024. file3:    dc.b    "demo",0            ; filename for 1st selectable item
  2025.     even
  2026. file4:    dc.b    "intro",0
  2027.     even
  2028. file5:    dc.b    "game",0
  2029.     even
  2030. file6:    dc.b    "",0
  2031.     even
  2032. file7:    dc.b    "1",0
  2033.     even
  2034. file8:    dc.b    "2",0
  2035.     even
  2036. file9:    dc.b    "3",0
  2037.     even
  2038. file10:    dc.b    "4",0
  2039.     even
  2040. file11:    dc.b    "5",0
  2041.     even
  2042. file12:    dc.b    "",0
  2043.     even
  2044. file13:    dc.b    "7",0
  2045.     even
  2046. file14:    dc.b    "8",0
  2047.     even
  2048. file15:    dc.b    "",0
  2049.     even
  2050. file16:    dc.b    "",0
  2051.     even
  2052.  
  2053.     end
  2054.  
  2055. The above example does the following:
  2056.  
  2057. the menu will display --- Free Menu --- in the first line which you wont be
  2058. able to select, this will be followed by a blank line and 3 selectable items
  2059. Our first Demo, Yet another Intro, Crappy Game. If these items are selected
  2060. the menu will execute the appropriate program demo,intro or game.
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.